#include <stdio.h>
#include <stdlib.h>

/**
 * @brief 打印数组中的所有元素
 * @param arr 待打印的数组
 * @param size 数组的大小
 */

void printArr(int arr[], int size);
int *reverseArr(int arr[], int size);
int *reverseArr2(int arr[], int size);

/**
 * @brief 主函数，程序入口点
 * @return 成功执行返回0
 */
int main() {
  int arr[5] = {1, 2, 3, 4, 5};
  int len = sizeof(arr) / sizeof(arr[0]);
  printf("arr的地址为：%p\n", arr);
  printArr(arr, len);
  int *brr = reverseArr(arr, len);
  printf("brr的地址为：%p\n", brr);
  printArr(brr, len);
  int *crr = reverseArr2(brr, len);
  printf("crr的地址为：%p\n", crr);
  printArr(crr, len);

  return 0;
}

void printArr(int arr[], int size) {
  for (int i = 0; i < size; i++) {
    printf("%d ", arr[i]);
  }
  printf("\n");
}

int *reverseArr(int arr[], int size) {
  int *brr = (int *)malloc(size * sizeof(int));
  if (brr == NULL)
    return NULL;
  for (int i = 0; i < size; i++) {
    brr[i] = arr[i];
  }
  for (int i = 0; i < size / 2; i++) {
    int temp = brr[i];
    brr[i] = brr[size - 1 - i];
    brr[size - 1 - i] = temp;
  }
  return brr;
}

/**
 * @brief 逆序复制数组元素到一个新的动态分配的数组中
 *
 * 该函数会创建一个新的数组，将传入数组中的元素逆序复制到新数组中。
 * 若内存分配失败，将返回 NULL。
 *
 * @param arr 待逆序的源数组
 * @param size 源数组的大小
 * @return int* 指向逆序后新数组的指针，若内存分配失败则返回 NULL
 */
int *reverseArr2(int arr[], int size) {
  // 动态分配内存，用于存储逆序后的数组
  // 分配的内存大小为 size 个 int 类型元素所占的空间
  int *brr = (int *)malloc(size * sizeof(int));

  // 检查内存分配是否成功
  if (brr == NULL) {
    // 若内存分配失败，返回 NULL 表示操作失败
    return NULL;
  }

  // 遍历源数组，将元素逆序复制到新数组中
  for (int i = 0; i < size; i++) {
    // 将源数组的最后一个元素开始，依次复制到新数组的开头
    brr[i] = arr[size - 1 - i];
  }

  // 返回指向逆序后新数组的指针
  return brr;
}